Ext.namespace("uft.extend.form");

/**
 * 定义了一个从本地读取数据的combox，并定义了一个基本的数据选项(是，否)，
 * 可配置项包括：
 * id,hiddenName,renderTo,editable,fieldLabel,emptyText,store.
 * @class uft.extend.form.LocalCombox
 * @extends Ext.form.ComboBox
 */
uft.extend.form.LocalCombox= Ext.extend(Ext.form.ComboBox, {
	constructor:function(config){
		Ext.apply(this, config);
//		var emptyText = (config.emptyText == undefined)?'请选择...':config.emptyText;
		var editable = (config.editable ===true)?true:false;
		var allowBlank = (config.allowBlank ===false)?false:true;
		var hiddenLabel = (config.hiddenLabel == true)?true:false;
		var store;
		if(config.store == undefined){
			store = new Ext.data.SimpleStore({  //填充的数据
                 fields : ['text', 'value'],
                 data : [['是', '1'], ['否', '0']]
            });
		}else{
			store = config.store;
		}
		
	     uft.extend.form.LocalCombox.superclass.constructor.call(this, {
			id : config.id,
			hiddenName : config.hiddenName,
			renderTo : config.renderTo,
			fieldLabel : config.fieldLabel,
//			emptyText : emptyText,
			editable : editable, 
			hiddenLabel : hiddenLabel,
			selectOnFocus : true,
			width : config.width,
			triggerAction: 'all', 
			displayField : 'text',
			valueField : 'value',
			typeAhead: true,   
			minChars:2,
			autocomplete:'on', 
			mode: 'local',
			allowBlank: allowBlank,
			store : store		
		 });
	}
});
Ext.reg("localcombo",uft.extend.form.LocalCombox);

/**
 * 从远程读取数据的combox
 * 可配置的数据项：
 * id,renderTo,editable,fieldLabel,emptyText,dataUrl,baseParams
 * 返回的数据格式如：
 * {"records":[{"text":"abc","id":"123"},{"text":"def","id":"345"}]}
 * xtype比较特殊，区别于Ext自身的combo，故使用uftcombo
 * @param {} config
 */
uft.extend.form.Combox= Ext.extend(Ext.form.ComboBox, {
	baseParams : {},//真正用于查询数据的参数
	extendParams : {},//可能随时变化的参数
	params : null,//自定义的一个string类型的参数，需要经过识别后成为对象
	dataUrl : null,//查询下拉项的url
	getByValueUrl : null,//如果store没有加载的情况下，需要通过这个url去加载显示值
	constructor:function(config){
		Ext.apply(this, config);
		var editable = (config.editable ===true)?true:false;
		var allowBlank = (this.allowBlank ===false)?false:true;
		var hiddenLabel = (config.hiddenLabel == true)?true:false;
	     var s = new Ext.data.JsonStore({
	         url: ctxPath +this.dataUrl,
	         baseParams : this.baseParams,
	         remoteSort: true,   
	         root:'records',   
	         fields:['value', 'text']  
	     });
		
	     uft.extend.form.Combox.superclass.constructor.call(this, {
			id : this.id,
			name : this.name,
			hiddenName : this.hiddenName,
			renderTo : this.renderTo,
			fieldLabel : this.fieldLabel,
			hiddenLabel : hiddenLabel,
			editable : editable,  
			triggerAction: 'all', 
			displayField : 'text',
			valueField : 'value',
			allowBlank: allowBlank,
			selectOnFocus : false,
			typeAhead: true,   
			minChars:2,
			autocomplete:'on', 
			mode: 'remote',
			store: s    
		 });
	},
	//解析自定义的参数，或者从其他表单域设置过来的参数
	resolveParams : function(){
		//default params aaa=1;bbb=2,因为nc模板的自定义字段3不支持单引号等特殊字符
		//aaa:'1';bbb:'2';ccc:${Ext.getCmp('id').getValue()};_cond:'abc=1'
		if(this.params){
			var arr = this.params.split(";");
			for(var i=0;i<arr.length;i++){
				if(arr[i].indexOf(":")==-1){
					//不是使用冒号分隔
					var arr1=arr[i].split("=");
				}else{
					var arr1=arr[i].split(":");
				}
				this.extendParams[arr1[0]] = uft.Utils.resolveExpression(arr1[1]);
			}
		}
	},	
	/**
	 * 增加查询条件
	 * params : {key1:1,key2:'a'}
	 */
	addExtendParams : function(params){
		if(params){
			var key;
			for(key in params){
				this.extendParams[key] = params[key];
			}
		}
	},
	/**
	 * params是否包含了newParams中的所有元素，是则返回true
	 * @param {} params
	 * @param {} newParams
	 */
	contains : function(params,newParams){
		var key;
		for(key in newParams){
			if(params[key]!=newParams[key]){
				return false;
			}
		}
		return true;
	},
    getParams : function(q){
        var params = uft.extend.form.Combox.superclass.getParams.call(this,q);
        this.resolveParams();
        if(this.extendParams){
        	var key;
			for(key in this.extendParams){
				params[key]=this.extendParams[key];
				this.baseParams[key]=this.extendParams[key];
			}
        }
        return params;
    },	
	//展开下拉项函数，比较参数是否改变，如果改变了，那么设置下lastQuery,主要是为了使得lastQuery跟上次是不同的，这样可以重新查询
    //参考Combo.js 1232行
 	onTriggerClick : function(){
		if(!this.contains(this.baseParams,this.extendParams)){
			var options = {};
			options.params = this.extendParams;
			var key;
			for(key in this.extendParams){
				this.baseParams[key]=this.extendParams[key];
			}
			this.lastQuery = '_';
		}
		uft.extend.form.Combox.superclass.onTriggerClick.call(this);
	},
    setValue : function(v){
        var text = v;
        if(this.valueField){
            var r = this.findRecord(this.valueField, v);
            if(r){
                text = r.data[this.displayField];
            }else{
				var count = this.store.getCount();
				if(count==0 && v){
					//根据value查询
					if(!this.getByValueUrl){
						alert('下拉框没有配置getByValueUrl属性！');
						return null;
					}
					text = Utils.doSyncRequest(ctxPath + this.getByValueUrl,{value:v},'POST');
				}else{
					text = this.valueNotFoundText;
				}
            }
        }
        this.lastSelectionText = text;
        if(this.hiddenField){
            this.hiddenField.value = Ext.value(v, '');
        }
        //FIXME XUQC 2013-1-23
        var val = text;
        if(val && typeof(val)=='string'){
        	val = val.replace('&nbsp;','');
        }
        Ext.form.ComboBox.superclass.setValue.call(this, val);
        this.value = v;
        return this;
    }
});
Ext.reg("uftcombo",uft.extend.form.Combox);
Ext.reg("remotecombo",uft.extend.form.Combox);


/**
 * 支持分页的combox，从远程读取数据
 * 返回的数据如：
 * {"records":[{"name":"abc","id":"12321"},{"name":"hfh","id":"567"}],"totalRecords":7}
 * @class uft.extend.form.PageCombox
 * @extends Ext.form.ComboBox
 */
uft.extend.form.PageCombox= Ext.extend(Ext.form.ComboBox, {
	constructor:function(config){
		 Ext.apply(this, config);
//		 var emptyText = (config.emptyText == undefined)?'请选择...':config.emptyText;
		 var editable = (config.editable ===true)?true:false;
		var allowBlank = (config.allowBlank ===false)?false:true;
		 var pageSize = (config.pageSize == undefined)?10:config.pageSize;
	     uft.extend.form.PageCombox.superclass.constructor.call(this, {
	     	 id : config.id,
	     	 name : config.name,
	     	 hiddenName : config.hiddenName,
	    	 renderTo : config.renderTo,
	         valueField: 'value',  
	         displayField: 'text',  
	         editable : editable,  
	         typeAhead : true,
//	         emptyText  : emptyText,
	         allowBlank: allowBlank,
	         selectOnFocus : true,
	         triggerAction: 'all',  
			 minChars:2,
			 autocomplete:'on',	         
	         mode: 'remote',  
	         minListWidth:250,  
	         pageSize:pageSize,  
	         store: new Ext.data.JsonStore({  
	             url: config.dataUrl,
	             baseParams : config.baseParams,
	             root:'records',   
	             totalProperty: 'totalRecords',   
	             remoteSort: true,   
	             fields:['value', 'text']  
	         })         
		 })	;
	}
});
Ext.reg("pagecombo", uft.extend.form.PageCombox);

/**
 * 从页面的select元素读取数据的combox
 * transform属性是必须的，作为数据源
 * @class uft.extend.form.TranCombox
 * @extends Ext.form.ComboBox
 */
uft.extend.form.TranCombox= Ext.extend(Ext.form.ComboBox, {
	constructor:function(config){
		 Ext.apply(this, config);
//		 var emptyText = (config.emptyText == undefined)?'请选择...':config.emptyText;
		var editable = (config.editable ===true)?true:false;
		var allowBlank = (config.allowBlank ===false)?false:true;
		 var width = (config.width == undefined)?200:config.width;
		 var anchor = (config.anchor == undefined)?"85%":config.anchor;
	     uft.extend.form.TranCombox.superclass.constructor.call(this, {
			id : config.id,
			name : config.name,
			hiddenName : config.hiddenName,
	        fieldLabel :  config.fieldLabel,
	        renderTo : config.renderTo,
//	        emptyText : emptyText,
	        editable : editable,  
	        allowBlank: allowBlank,
	        selectOnFocus : true,
	        anchor : anchor,
	        typeAhead: true,
	   		triggerAction: 'all',
	   		autocomplete:'on', 
	   		lazyRender: true,
	        transform : config.transform  //页面中的select元素的id，是必须的
		 })	;
	}
});
Ext.reg("trancombo", uft.extend.form.TranCombox);